#ifndef RASTERIZER_TEXTURE_H
#define RASTERIZER_TEXTURE_H

#include "global.hpp"
#include <eigen3/Eigen/Eigen>
#include <opencv2/opencv.hpp>

class Texture{

private:
    cv::Mat image_data;

public:
    Texture(const std::string& name){
        image_data = cv::imread(name);
        // `cv::imread()` 返回一个 `cv::Mat` 对象。
        cv::cvtColor(image_data, image_data, cv::COLOR_RGB2BGR);
        // 将读取的图像数据从 RGB 颜色空间转换到 BGR 颜色空间。
        width = image_data.cols;
        height = image_data.rows;
    }

    int width, height;

    // 传入纹理坐标，获取颜色
    Eigen::Vector3f getColor(float u, float v){
        auto u_img = u * width;
        // 将纹理的 u 坐标（范围 [0, 1]）缩放到图像的宽度范围 [0, width]。
        auto v_img = (1 - v) * height;
        // 将纹理的 v 坐标（范围 [0, 1]）缩放到图像的高度范围 [0, height]。
        // v 的上下是反过来的
        // 计算纹理坐标对应的图像坐标
        auto color = image_data.at<cv::Vec3b>(v_img, u_img);
        // 获取图像中对应坐标的颜色值
        return Eigen::Vector3f(color[0], color[1], color[2]);
    }
};

#endif //RASTERIZER_TEXTURE_H